# coding=utf-8
from flask import g
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from comment.ultils.decorators import Login_required
from comment.modules.user import User
from comment.modules.Letter import Letter,Letter_Detail
from comment.modules import db
from financial.resorces.letter.serializer import LetterPaginateSerializer

class Letter_Res(Resource):
    '''发送消息资源类'''

    '''拦截器看用户有没有登录过'''
    # 拦截器他会在LoginOut的所有的视图函数都会在执行视图函数之前，做一下装饰器的拦截
    method_decorators = [Login_required]  # 使用了登录拦截的装饰器

    def post(self):
        '''
        发送消息
        :return:
        '''
        rp = RequestParser()
        rp.add_argument('title',required=True) #消息标题
        rp.add_argument('group') #群发信息的用户组，可以为空
        rp.add_argument('rec_id') #单个用户发送的时候，接受用户ID，可以为空
        rp.add_argument('content',required=True) #内容

        args = rp.parse_args()

        title = args.get('title')
        group = args.get('group')
        rec_id = args.get('rec_id')
        content = args.get('content')

        #发送消息的用户ID
        uid = g.user_id
        user = User.query.filter(User.id == uid).first()

        #群发消息,group有三个值：0：普通用户组，1.管理组，2.全体用户
        if group == '0' or group == '1': #根据用户角色查询所有的接收用户
            rec_list = User.query.filter(User.role == group).all()
        if group == '2': #群发消息给所有用户
            rec_list = User.query.all()

        #单个用户发送消息
        if rec_id:
            rec_user = User.query.filter(User.id == rec_id).first()
            if rec_user:
                rec_list = [rec_user]

        #把消息详情对象，插入到数据库中
        new_letter_detail = Letter_Detail(title=title,detail=content)
        db.session.add(new_letter_detail)
        db.session.flush() #commit提交到数据库中，flush刷新到缓冲区中（表中没有数据，有自增的ID）

        for rec_user in rec_list:
            #给每一个用户都发送消息
            letter = Letter(sendID=user.username,recID=rec_user.id,detail_id=new_letter_detail.id,state=0)
            db.session.add(letter)

        db.session.commit()
        return {'msg':'ok'}

    def get(self):
        '''
        当前用户收到的消息列表（分页）
        :return:
        '''

        uid = g.user_id #当前登录的用户ID
        user = User.query.filter(User.id == uid).first()


        rp = RequestParser()
        rp.add_argument('curPage',required=True) #访问的页号
        rp.add_argument('perPage',required=True) #每页显示数据的条数

        args = rp.parse_args()

        curPage = int(args.get('curPage'))
        perPage = int(args.get('perPage'))

        #pageinte传三个参数，一个是访问的页号，一个是每页显示的数据，最后一个error_out=Flase不希望他报错
        #letter_list:是Pagination类型，包含分页数据，同时在items属性中包含信息列表数据
        letter_list = Letter.query.filter(Letter.recID == uid).paginate(curPage,perPage,error_out=False)

        '''
        怎么上传到网页上，通过py对象，转化成字典，在通过字典来转化成JSON对象，因为网页接收的是JSON对象，这里有专门有转化成JSON的工具
        在ultils里面有一个output的py，是专门把字典转化成JSON格式
        '''

        dict_data = LetterPaginateSerializer(letter_list).to_dict() #把他转化成字典

        return {'msg':'ok','data':dict_data}

    def put(self):
        """
        更新消息已读状态
        """
        rp = RequestParser()
        rp.add_argument('message_id', required=True)
        args = rp.parse_args()
        m_id = args.get('message_id')

        letter = Letter.query.filter(Letter.id == m_id).first()
        if letter:
            letter.state = 1
            db.session.commit()
            return {'msg': "ok"}
        else:
            return {'message': "此消息不存在", 'code': 20005}

    def delete(self):
        """
        删除消息
        """
        rp = RequestParser()
        rp.add_argument('message_id', required=True)
        args = rp.parse_args()
        m_id = args.get('message_id')

        letter = Letter.query.filter(Letter.id == m_id)
        if letter:
            letter.delete()
            db.session.commit()
            return {'msg': "ok"}
        else:
            return {'message': "此消息不存在", 'code': 20005}



















